package pckDao;

import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import pckEntidad.Marca;
import pckEntidad.Producto;
import pckUtil.Conexion;


public class ProductoDao implements Serializable {

    private final Conexion oConexion=new Conexion();
    private Producto oProducto = null;
    private List<Producto> lisProducto=null;
    private List<Producto> lisProductoDesc=null;
    private List<Producto> lisProductoCod=null;
    private List<Producto> lisProductoMar=null;
    
    public void insertar(Producto oPro){
         String sql = "{call sping_Producto(?,?,?,?,?,?,?,?,?)}";
         CallableStatement cst;
        try {
            cst = oConexion.getConnection().prepareCall(sql);
            cst.setString(1, oPro.getDescpro());
            cst.setDouble(2, oPro.getStockact());
            cst.setDouble(3, oPro.getStockmin());
            cst.setString(4, oPro.getEstapro());
            cst.setString(5, oPro.getCodipro());
            cst.setString(6, oPro.getObspro());
            cst.setString(7, oPro.getMarca().getIdmarc());
            cst.setString(8, oPro.getLinea().getIdline());
            cst.setDouble(9, oPro.getPrecvent());
            cst.execute();            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
           
     }
    
            
    public List<Producto> listar(){
    String sql = "{call splis_Producto}";
        try {
            CallableStatement cst = oConexion.getConnection().prepareCall(sql);
            ResultSet rst = cst.executeQuery();
            lisProducto= new ArrayList<Producto>();
            while(rst.next()){
                oProducto = new Producto();
                oProducto.setIdprod(rst.getString(1)); 
                oProducto.setDescpro(rst.getString(2));
                oProducto.setStockact(rst.getDouble(3));
                oProducto.setStockmin(rst.getDouble(4));
                oProducto.setEstapro(rst.getString(5));
                oProducto.setCodipro(rst.getString(6));
                oProducto.setObspro((rst.getString(7)));
                oProducto.setMarca(new MarcaDao().obtener(rst.getString(8)));
                oProducto.setLinea(new LineaDao().obtener(rst.getString(9)));
                oProducto.setPrecvent(rst.getDouble(10));
                lisProducto.add(oProducto);
            }
            return  lisProducto;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
         return null;
     }
    
    
    public void actualizar( Producto oPro){
        try {
            String sql = "{call spact_tblProducto(?,?,?,?,?,?,?,?,?,?)}";
            CallableStatement cst = oConexion.getConnection().prepareCall(sql);
            cst.setString(1, oPro.getIdprod());
            cst.setString(2, oPro.getDescpro());
            cst.setDouble(3, oPro.getStockact());
            cst.setDouble(4, oPro.getStockmin());
            cst.setString(5, oPro.getEstapro());
            cst.setString(6, oPro.getCodipro());
            cst.setString(7, oPro.getObspro());
            cst.setString(8, oPro.getMarca().getIdmarc());
            cst.setString(9, oPro.getLinea().getIdline());
            cst.setDouble(10,oPro.getPrecvent());
            cst.execute();
            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
         
     }
    
    public void desactivar(String idPro){
    try{
        String sql="{call spdes_Producto(?)}";
        CallableStatement cst=oConexion.getConnection().prepareCall(sql);
        cst.setString(1,idPro);
        cst.execute();
    }catch(SQLException ex){
        JOptionPane.showMessageDialog(null, ex.getMessage());
    }
         
    }
    
  public List<Producto> buscarDesc(String descri) {       
         String sql = "{call spbus_productoDes(?)}";
        try {
            CallableStatement cst = oConexion.getConnection().prepareCall(sql); 
            cst.setString(1, descri);
//            cst.registerOutParameter(3,Types.VARCHAR);
            ResultSet rst = cst.executeQuery();
            lisProductoDesc= new ArrayList<Producto>();
            boolean econtrado=false;
            while(rst.next()){
               oProducto = new Producto();
               oProducto.setIdprod(cst.getString(1));
               oProducto.setDescpro(cst.getString(2));
               oProducto.setStockact(cst.getDouble(3));
               oProducto.setStockmin(cst.getDouble(4));
               oProducto.setEstapro(cst.getString(5));
               oProducto.setCodipro(cst.getString(6));
               oProducto.setObspro(cst.getString(7));
               oProducto.setMarca(new MarcaDao().obtener(cst.getString(8)));
               oProducto.setLinea(new LineaDao().obtener(cst.getString(9)));
               oProducto.setPrecvent(cst.getDouble(10));
               lisProductoDesc.add(oProducto);
                econtrado=true;                
            }
            if (!econtrado) {
                JOptionPane.showMessageDialog(null, "El producto : "+descri+ "  no fue encontrado");
            }
            return  lisProductoDesc;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
         return null;
     }  
  public Producto buscarCod(String codigo) {       
         String sql = "{call spbus_productoCod(?)}";
        try {
            CallableStatement cst = oConexion.getConnection().prepareCall(sql); 
            cst.setString(1, codigo);
//            cst.registerOutParameter(3,Types.VARCHAR);
            ResultSet rst = cst.executeQuery();
            boolean econtrado=false;
            while(rst.next()){
               oProducto = new Producto();
               oProducto.setIdprod(cst.getString(1));
               oProducto.setDescpro(cst.getString(2));
               oProducto.setStockact(cst.getDouble(3));
               oProducto.setStockmin(cst.getDouble(4));
               oProducto.setEstapro(cst.getString(5));
               oProducto.setCodipro(cst.getString(6));
               oProducto.setObspro(cst.getString(7));
               oProducto.setMarca(new MarcaDao().obtener(cst.getString(8)));
               oProducto.setLinea(new LineaDao().obtener(cst.getString(9)));
               oProducto.setPrecvent(cst.getDouble(10));

                econtrado=true;                
            }
            if (!econtrado) {
                JOptionPane.showMessageDialog(null, "El producto : "+codigo+ "  no fue encontrado");
            }
            return  oProducto;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
         return null;
     }
  public List<Producto> buscarMarc(String marca) {       
         String sql = "{call spbus_productoMar(?)}";
        try {
            CallableStatement cst = oConexion.getConnection().prepareCall(sql); 
            cst.setString(1, marca);
//            cst.registerOutParameter(3,Types.VARCHAR);
            ResultSet rst = cst.executeQuery();
            lisProductoMar= new ArrayList<Producto>();
            boolean econtrado=false;
            while(rst.next()){
               oProducto = new Producto();
               oProducto.setIdprod(cst.getString(1));
               oProducto.setDescpro(cst.getString(2));
               oProducto.setStockact(cst.getDouble(3));
               oProducto.setStockmin(cst.getDouble(4));
               oProducto.setEstapro(cst.getString(5));
               oProducto.setCodipro(cst.getString(6));
               oProducto.setObspro(cst.getString(7));
               oProducto.setMarca(new MarcaDao().obtener(cst.getString(8)));
               oProducto.setLinea(new LineaDao().obtener(cst.getString(9)));
               oProducto.setPrecvent(cst.getDouble(10));
               lisProductoMar.add(oProducto);
                econtrado=true;                
            }
            if (!econtrado) {
                JOptionPane.showMessageDialog(null, "El producto : "+marca+ "  no fue encontrado");
            }
            return  lisProductoMar;
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
         return null;
     }
}